package demo04

/**
 * @author xiaoZhao
 * @date 2022/6/28
 * @describe 函数高阶应用
 */
object Test06_HighOrderFunction {
  def main(args: Array[String]): Unit = {
    def f(n: Int): Int = {
      println("f调用")
      n + 1
    }

    def fun(): Int = {
      println("fun 被调用")
      1
    }

    val result: Int = f(123)

    fun()
    fun


    // 1.函数作为值进行传递   f _ 表示f函数本身
    // 前面为参数类型 后面为返回值类型
    // f1 和 f2 实际上是函数的引用  scala底层是一个完全面向对象、函数式编程语言

    val f1: Int => Int = f
    // 等价于
    val f2 = f _
    println(f1)
    println(f2)
    println(f1 == f2)
    println(f1(12))

    val f3: () => Int = fun _
    val f4 = fun
    println(f3)
    println(f4)

    // 2.函数作为参数传递
    // 定义二元运算函数
    def dualEval(op: (Int, Int) => Int, a: Int, b: Int): Int = {
      op(a, b)
    }

    def add(a: Int, b: Int): Int = {
      a + b
    }

    println(dualEval(add, 12, 32))
    println(dualEval((a, b) => a + b, 12, 32))
    println(dualEval(_ + _, 12, 32))

    // 3.函数作为函数的返回值返回
    // 函数嵌套
    def f5(): Int => Unit = {
      def f6(a: Int): Unit = {
        println("f6被调用" + a)
      }
      f6 // 当函数直接返回
    }

    println(f5())
    println(f5)

//    val f6 = f5()
//    println(f6)
//    println(f6(22)

    // 等价于
    println(f5()(12))

  }
}
